package com.util.textConversion;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

/**
 * String类型去掉null处理
 * 
 * 
 */
public class TextConversion implements UserType, Serializable {
	private static final long serialVersionUID = -1345809111982767750L;

	private static final int[] SQL_TYPES = { Types.VARCHAR };

	/**
	 * 构造函数
	 * 
	 * @param desc
	 */
	public TextConversion() {
		super();
	}

	public Object assemble(Serializable value, Object arg1)
			throws HibernateException {
		return value;
	}

	/*
	 * 由于AddressType是不可变的，所以深拷贝可以直接返回对象引用
	 */
	public Object deepCopy(Object value) throws HibernateException {
		return value;
	}

	/*
	 * 当把TextConversion类型数据写入二级缓存时，此方法被调用
	 */
	public Serializable disassemble(Object value) throws HibernateException {
		return (Serializable) value;
	}

	/*
	 * 两个对象是否相等
	 */
	public boolean equals(Object x, Object y) throws HibernateException {
		if (x == y) {
			return true;
		}
		if (x == null || y == null) {
			return false;
		}
		return x.equals(y);
	}

	/*
	 * 得到hash码
	 */
	public int hashCode(Object arg0) throws HibernateException {
		return arg0.hashCode();
	}

	/*
	 * 表明这个类的实例在创建以后就不可以改变属性
	 */
	public boolean isMutable() {
		return false;
	}

	/**
	 * 从JDBC的ResultSet中读取数据，读取数据并组装成一个TextConversion对象。// 此方法要求对可能出现null的情况做处理。
	 */
	public Object nullSafeGet(ResultSet rs, String[] arg1, Object arg2)
			throws HibernateException, SQLException {
		// 如果rs为null
		if (rs == null) {
			return "";
		}
		String str = rs.getString(arg1[0]);
		// 如果数据库中该字段为null
		if (str == null) {
			str = "";
		}
		return str;
	}

	/*
	 * 在Hibernate进行数据保存时被调用
	 */
	public void nullSafeSet(PreparedStatement st, Object value, int index)
			throws HibernateException, SQLException {
		if (value == null) {
			st.setString(index, "");
		} else {
			String str = (String) value;
			st.setString(index, str);
		}
	}

	// 无动作
	public Object replace(Object arg0, Object arg1, Object arg2)
			throws HibernateException {
		return arg0;
	}

	/*
	 * Hibernate返回什么样的映射类型
	 */
	public Class<?> returnedClass() {
		return TextConversion.class;
	}

	/*
	 * 这个方法告诉Hibernate在成生DDL时对列采用什么样的SQL语法
	 */
	public int[] sqlTypes() {
		return SQL_TYPES;
	}

}

